package cn.xzqwjw.taskmanager.service;

import cn.xzqwjw.taskmanager.domain.pojo.Article;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.servlet.http.HttpServletRequest;

/**
 * @author wjw
 */
public interface ArticleService extends IService<Article> {

  /**
   * 添加文章
   *
   * @param article 要添加的文章对象
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String add(Article article);

  /**
   * 添加任务时，同时添加一篇文章，为该任务相关的文字说明
   *
   * @param article 要添加的文章对象
   * @return 返回新添加的文章的id
   */
  int add4Task(Article article);

  /**
   * 根据id删除文章，逻辑删除
   *
   * @param idArticle 文章id
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String delById(int idArticle);

  /**
   * 从回收站中根据id删除文章，真实删除
   *
   * @param idArticle 文章id
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String delByIdReal(int idArticle);

  /**
   * 批量逻辑删除文章
   *
   * @param articleIds 文章id
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String batchDel(String articleIds);

  /**
   * 从回收站中批量真实删除文章
   *
   * @param articleIds 文章id
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String batchDelReal(String articleIds);

  /**
   * 修改文章
   *
   * @param article 要修改的文章对象
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String modifyAll(Article article);

  /**
   * 修改任务时，同时修改任务对应文章
   *
   * @param article 要添加的文章对象
   * @return 返回是否修改成功
   */
  boolean modifyAll4Task(Article article);

  /**
   * 设置单篇文章状态（流程2：草稿 <-> 签发）
   * action = "draft"，不需 idAdmin
   * 撤销提交审核
   * action = "delete"，不需 idAdmin
   * 普通编辑将文章移动到回收站，普通编辑只能删除自己的文章，不能删除其他人的文章
   * 审核及签发编辑不需删除功能
   * action = "uncheck"，不需 idAdmin
   * 草稿提交审核 / 已签发文章设为待审
   * action = "signed"，idAdmin 是签发管理员的id
   * 签发编辑将待审文章直接设为签发
   *
   * @param idAdmin   管理员id
   * @param idArticle 文章id
   * @param action    是审核还是签发 check 、sign
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String patchStatus(int idAdmin, int idArticle, String action);

  /**
   * 从回收站恢复
   *
   * @param idArticle 文章id
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String unDel(int idArticle);

  /**
   * 批量设置文章状态
   *
   * @param idAdmin 管理员id
   * @param ids     文章ids
   * @param action  是审核还是签发 check 、sign
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String batchPatchStatus(int idAdmin, String ids, String action);

  /**
   * 批量移动文章
   *
   * @param idCategory 目标栏目id
   * @param ids        文章ids
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String batchMove(int idCategory, String ids);

  /**
   * 根据id得到该文章所有信息
   *
   * @param id 要查询的id
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String queryById(int id);

  /**
   * 管理员分页获取所有栏目或指定栏目下所有已审未审文章、回收站文章
   * flagDeleted=0 表示所有未删文章，=1 表示回收站文章
   * editorId=0 表示查询所有编辑的文章，editorId>0 表示查询某编辑的所有文章
   * categoryId=0 表示查询所有文章，categoryId>0 表示查询某栏目下所有文章
   *
   * @param pageCurrent 当前页数
   * @param pageSize    每页记录数
   * @param flagDeleted 删除标识 0 表示所有未删文章，1 表示回收站文章
   * @param status      文章状态 0：草稿 1：删除 2：待审 3：已审 4：待签发 5：已签发 6：已生成静态文件
   * @param idCategory  栏目id 0 表示调用所有文章，>0 表示调用某栏目下所有文章
   * @param idEditor    编辑id 0 表示调用所有编辑的文章，>0 表示调用某编辑的所有文章
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String listPage4Admin(int pageCurrent, int pageSize,
                        int flagDeleted, String status,
                        int idCategory, int idEditor);

  /**
   * 管理员根据标题关键字词搜索文章，返回分页数据
   *
   * @param pageCurrent 当前页数
   * @param pageSize    每页记录数
   * @param keyword     标题所含关键字词
   * @param idEditor    编辑id （0 表示调用所有编辑的文章，>0 表示调用某编辑的所有文章）
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String search4Admin(int pageCurrent, int pageSize, String keyword, int idEditor);

  /**
   * 前端分页获取所有栏目或指定栏目下或一组栏目ids下所有已签发文章
   *
   * @param pageCurrent 当前页数
   * @param pageSize    每页记录数
   * @param categoryIds 指定栏目下或一组栏目ids
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String listPage4Front(int pageCurrent, int pageSize, String categoryIds);

  /**
   * 前端根据标题关键字词搜索文章，返回分页数据
   *
   * @param pageCurrent 当前页数
   * @param pageSize    每页记录数
   * @param keyword     标题所含关键字词
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String search4Front(int pageCurrent, int pageSize, String keyword);

  /**
   * 验证参数管理员id是否是已登录管理员的id，防止操作其他管理员的文章
   */
  void checkAdmin(HttpServletRequest request, int idAdmin);

}
